// 状态管理类（状态模式）
#ifndef STATEMANAGER_HPP
#define STATEMANAGER_HPP

#include <memory>
#include <string>

// 使用手柄切换状态模式。做一个oled屏幕展示菜单

namespace WaveGuard {

    // 前置声明
    class State;

    /**
     * @class StateManager
     * @brief 状态管理器（上下文），负责管理系统状态
     */
    class StateManager {
    public:
        StateManager();

        /**
         * @brief 切换到警戒状态
         */
        void setAlertState();

        /**
         * @brief 切换到侦察状态
         */
        void setReconState();

        /**
         * @brief 切换到手动控制状态
         */
        void setManualState();

        /**
         * @brief 获取当前状态名称
         * @return 当前状态名称字符串
         */
        const std::string getCurrentStateName() const;

        /**
         * @brief 执行当前状态的行为
         */
        void executeStateAction();

        // 允许状态类访问状态切换方法
        friend class State;

    private:
        /**
         * @brief 内部状态切换方法
         * @param newState 要切换的新状态
         */
        void changeState(std::unique_ptr<State> newState);

        std::unique_ptr<State> currentState;
    };

    /**
     * @class State
     * @brief 抽象状态接口
     */
    class State {
    public:
        virtual ~State() = default;

        /**
         * @brief 执行状态特定的行为
         * @param context 状态管理器上下文
         */
        virtual void executeAction(StateManager &context) = 0;

        /**
         * @brief 获取状态名称
         * @return 状态名称字符串
         */
        virtual const char *getName() const = 0;
    };

    /**
     * @class AlertState
     * @brief 警戒状态
     */
    class AlertState : public State {
    public:
        void executeAction(StateManager &context) override;
        const char *getName() const override { return "ALERT"; }
    };

    /**
     * @class ReconState
     * @brief 侦察状态
     */
    class ReconState : public State {
    public:
        void executeAction(StateManager &context) override;
        const char *getName() const override { return "RECON"; }
    };

    /**
     * @class ManualState
     * @brief 手动控制状态
     */
    class ManualState : public State {
    public:
        void executeAction(StateManager &context) override;
        const char *getName() const override { return "MANUAL"; }
    };

} // namespace WaveGuard

#endif // STATEMANAGER_HPP